package net.lzzy.algorithm.algorlib;


//参数类型T需要约束，约束T实现Comparable<T>接口
public abstract class BaseSort<T extends Comparable<? super T>> {
    //region 1.field字段

    T[] itmes;   //1、可接收参与排序的数据集合
    long time;        //2、可记录算法运行的时长（long字段+getter）
    int compareCount; //3、对比次数
    int compareMove;  //3、移动次数
    int compareSwop;  //3、交换次数
    long directSort;   //6、排序结果



    public BaseSort(T[] itmes) {  //1、数据集合
        this.itmes = itmes;
        compareCount = 0;
        compareMove = 0;
        compareSwop = 0;
    }

    void swop(int a,int b){   //5、用于交换两个元素位置的方法
        T temp=itmes[a];
        itmes[a]=itmes[b];
        itmes[b]=temp;
        compareSwop++;         //交换次数++
    }

    boolean comare(T a,T b) {  //4、用于比较两个元素大小的方法
        compareCount++;
        return a.compareTo(b) > 0;
    }
    public  String getResult(){    //6、返回排序结果的方法
        String display ="";
        for (T i : itmes) {
            display = display.concat(i + ",");
        }
        return  display.substring(0, display.length() - 1);
    }
    public void sortTime(){
        long startTime=System.currentTimeMillis();
        sort();
        long endTime=System.currentTimeMillis();
        time=endTime-startTime;
        directSort=System.currentTimeMillis()-startTime;
    }
    public abstract  void sort();   //抽象类
    public long getTime() {  //算法的运行时长
        return time;
    }
    public int getCompareCount() { //对比次数
        return compareCount;
    }
    public int getCompareMove() {  //移动次数
        return compareMove;
    }
    public int getCompareSwop() {  //交换次数
        return compareSwop;
    }
}
